package lanqiao._02算法训练.page03;

import java.util.Scanner;

/**
 * @author 挚爱之夕
 * @version 1.0
 * @implSpec 问题描述
 * 　　在那个过河卒逃过了马的控制以超级超级多的走法走到了终点之后，这匹马表示它不开心了……
 * 　　于是，终于有一天，它也过河了！
 * 　　由于过河马积累了许多的怨念，所以这次它过了河之后，再也没有什么东西可以限制它，它可以自由自在的在棋盘上驰骋。
 * 一开始，它是在一个n行m列棋盘的左下角（1,1）的位置，它想要走到终点右上角（n，m）的位置。
 * 而众所周知，马是要走日子格的。可是这匹马在积累了这么多怨念之后，它再也不想走回头路——也就是说，
 * 它只会朝向上的方向跳，不会朝向下的方向跳。
 * 　　那么，这匹马它也想知道，它想从起点跳到终点，一共有多少种走法呢？
 * 输入格式
 * 　　第一行两个数n，m，表示一个n行m列的棋盘，马最初是在左下角（1,1）的位置，终点在右上角（n，m）的位置。
 * 输出格式
 * 　　输出有一行，一个数表示走法数。由于答案可能很大，所以输出答案除以1000000007所得的余数即可。
 * 样例输入
 * 4 4
 * 样例输出
 * 2
 * 数据规模和约定
 * 　　n<=100,m<=100
 * <p>
 * 思路：
 * 1.左下角(1,1) 为原点, 竖直i轴，垂直j轴
 * 2.只向上走，所以(i,j) 可由(i-1,j-2)、(i-2,j-1)、(i-2,j+1)、(i-1,j+2)跳来
 * 3.第一次跳可达 (3,2), (2,3)
 * @since 2022 - 12 - 22 - 9:13
 */
public class _22过河马 {
}

class Main22 {
    static int mod = 1000000007;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt(), m = sc.nextInt();
        int[][] dp = new int[n + 1][m + 1];
        dp[2][3] = dp[3][2] = 1;
        for(int i = 3; i <= n; i++){
            for(int j = 1; j <= m; j++){
                if(j - 2 >= 1){
                    dp[i][j] = (dp[i][j] + dp[i - 1][j - 2]) % mod;
                }
                if(j - 1 >= 1){
                    dp[i][j] = (dp[i][j] + dp[i - 2][j - 1]) % mod;
                }
                if(j + 1 <= m){
                    dp[i][j] = (dp[i][j] + dp[i - 2][j + 1]) % mod;
                }
                if(j + 2 <= m){
                    dp[i][j] = (dp[i][j] + dp[i - 1][j + 2]) % mod;
                }
            }
        }
        System.out.println(dp[n][m]);
    }
}